LengthOfString<S>
文字列を引数にとって、その長さを返す
type-challenges 298
使用例
code:ts
type A0 = LengthOfString<''>; // 0
type A7 = LengthOfString<'mrsekut'>; // 7
type A16 = LengthOfString<'Sound! Euphonium'>; // 16
考え方のポイント
イメージ的にはこういうことをしたい
code:ts
type LengthOfString<S extends string> =
S extends ${infer H}${infer Tail}
? 1 + LengthOfString<Tail>
: 0;
1文字ずつ消化しつつ、結果(number)を1ずつインクリメントして再帰すればいい
しかし、型レベルの数値演算はできないので、それに代わる方法を考える必要がある
配列のlengthで型レベルincrement/decrementのはたまに見かけるパターンmrsekut.icon
再帰の度に配列の要素を追加していき、最終的にstrArr['length']で長さを取ればいい
定義例1
code:ts
type LengthOfString<S extends string> = StrToArray<S>'length';
type StrToArray<S extends string> =
S extends ${infer H}${infer Tail}
? H, ...StrToArray<Tail>
: [];
ちなみに、StrToArrayの結果はこんな感じ
code:ts
type A = StrToArray<'mrsekut'>; // "m", "r", "s", "e", "k", "u", "t"
定義例2
code:ts
type LengthOfString<S extends string, L extends unknown[] = []> =
S extends ${infer H}${infer R}
? LengthOfString<R, H, ...L>
: L'length';
2つの型引数を使って、1つの型定義で、定義例1と同じことをしている